// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rbchat.logic.more;

import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

import com.eva.android.widget.DataLoadableActivity;
import com.eva.android.widget.DataLoadingAsyncTask2;
import com.eva.android.widget.WidgetUtils;
import com.eva.android.widget.alert.AlertDialog;
import com.eva.epc.common.util.CommonUtils;
import com.eva.framework.dto.DataFromServer;
import com.x52im.rbchat.MyApplication;
import com.x52im.rbchat.R;
import com.x52im.rbchat.cache.ImageCacheLoader;
import com.x52im.rbchat.logic.more.avatar.AvatarHelper;
import com.x52im.rbchat.network.http.HttpRestHelper;
import com.x52im.rainbowchat.http.logic.dto.RosterElementEntity;
import com.x52im.rbchat.logic.more.avatar.ProfileAvatarChangeWrapper;
import com.x52im.rbchat.logic.profile.ProfileHelper;
import com.x52im.rbchat.utils.IntentFactory;
import com.x52im.rbchat.utils.PreferencesToolkits;
import com.x52im.rbchat.utils.ToolKits;

import java.lang.reflect.Field;

/**
 * 本地用户的个人中心界面。
 *
 * @author Jason
 * @since 1.0
 */
public class UserActivity extends DataLoadableActivity
{
	private final static String TAG = UserActivity.class.getSimpleName();

	/**  存储“个人相册”新功能提示的Shared Preferences key标识常量 */
	public final static String SHARED_PREFERENCES_KEY_MY$PROFILE_PHOTO_NEW = "__my_profile_photo_new__";
	/**  存储“语音介绍”新功能提示的Shared Preferences key标识常量 */
	public final static String SHARED_PREFERENCES_KEY_MY$PROFILE_VOICE_NEW = "__my_profile_voice_new__";
	
	// 用于关闭我的相片界面后的回调
	public final static int RESULT_CODE_FOR_UPLOAD_PHOTOS = 1;
	// 用于关闭我的声音界面后的回调
	public final static int RESULT_CODE_FOR_UPLOAD_PVOICES = 2;
	
	private static final int IS_CHANGE_PASSWORD = 1;
	private static final int IS_CHANGE_BASE_INFO = 0;
	private static final int IS_CHANGE_WHATSUP = 2;
	private static final int IS_CHANGE_OTHERCAPTION = 3;
	
	/** 标签：昵称 */
	private TextView nameTextView;
	/** 标签：ID */
	private TextView uidTextView;
	/** 标签：email */
	private TextView emailTextView;
	/** 标签：性别 */
	private TextView sexTextView;
	
	/** 标签：个性签名 */
	private TextView whatsupTextView;
	/** 标签：其它说明 */
	private TextView othercaptionTextView;
	
	/** 标签：头像 */
	private ImageView viewAvatar = null;
	
	/** 标签：个人相片数量 */
	private TextView viewPhotosCount;
	/** 标签：个人语音介绍数量 */
	private TextView viewPVoiceCount;
	
	/** 修改密码按钮 */
	private Button changePswBtn;
	
	private Button btnNickName;
	private Button btnQrcode;
	private Button btnSex;
	private Button btnWhatsup;
	private Button btnOthercaption;
	private Button btnProfilePhoto;
	private Button btnProfileVoice;
	
	/** 本地用户的个人数据对象引用 */
	private RosterElementEntity u;
	
	/** 本地用户图像管理包装实现类 */
	private ProfileAvatarChangeWrapper profilePhotoWrapper = null;

//	@Override
//	protected void onResume(){
//		super.onResume();
//		// 刷新本地用户头像（因为可能是用户从修改头像界面成功返回）
//		this.loadAvatar();
//	}
	
	/**
	 * 本方法由父类的onCreate()调用，子类可在此方法中实现自已的UI显示逻辑。
	 */
	@Override
	protected void initViews(Bundle savedInstanceState)
	{
		customeTitleBarResId = R.id.user_info_title_bar;
		setContentView(R.layout.user_info);
		
		nameTextView = (TextView) findViewById(R.id.user_info_name_text);
		uidTextView = (TextView) findViewById(R.id.user_info_uid_text);
		emailTextView = (TextView) findViewById(R.id.user_info_email_text);
		sexTextView = (TextView) findViewById(R.id.user_info_sex_text);
		changePswBtn = (Button)findViewById(R.id.user_info_update_psw_btn);
		whatsupTextView = (TextView)findViewById(R.id.user_info_update_whatsup_text);
		othercaptionTextView = (TextView)findViewById(R.id.user_info_update_othercaption_text);
		viewPhotosCount = (TextView)findViewById(R.id.user_info_photos_count);
		viewPVoiceCount = (TextView)findViewById(R.id.user_info_voices_count);
		viewAvatar = (ImageView)findViewById(R.id.main_more_settings_avatarView);
		
		btnNickName = (Button) findViewById(R.id.user_info_nick_nameBtn);
		btnQrcode = findViewById(R.id.user_info_other_qrcodeBtn);
		btnSex = (Button) findViewById(R.id.user_info_sexBtn);
		btnWhatsup = (Button) findViewById(R.id.user_info_what_s_up_btn);
		btnOthercaption = (Button) findViewById(R.id.user_info_other_captionBtn);
		btnProfilePhoto = (Button) findViewById(R.id.user_info_photosBtn);
		btnProfileVoice = (Button) findViewById(R.id.user_info_profilevoicesBtn);
		
		setTitle(R.string.user_info_title);
		
		this.setLoadDataOnCreate(false);
		
		u = MyApplication.getInstance(this).getIMClientManager().getLocalUserInfo();

		// 刷新界面上的某些新功能"NEW"标识的显示
		refreshNewFlags();
		// 刷新界面数据显示
		refreshDatas();
		// 此wrapper封装类中实现头像的上传和相关处理全总逻辑
		profilePhotoWrapper = new ProfileAvatarChangeWrapper(this, findViewById(R.id.user_info_MainLL));
		// 显示本地用户头像
		loadAvatar();
	}
	
	/**
	 * 本方法由父类的onCreate()调用，子类可在此方法中为各UI功能组件增加事件临听。
	 */
	@Override
	protected void initListeners() 
	{
        // 点击头像看大图
        viewAvatar.setOnClickListener(v -> {
			// 本地用户信息
			RosterElementEntity u = lu();
			if(u != null)
				AvatarHelper.showAvatarImage(self(), u.getUser_uid(), null);
		});

        // "我的二维码"
		btnQrcode.setOnClickListener(v -> {
			Intent i = IntentFactory.createQRCodeGenerateMyIntent(self());
			if(i != null)
				startActivity(i);
		});

		// 修改昵称事件处理
		btnNickName.setOnClickListener(v -> {
			// 编辑界面的UI初始化
			LayoutInflater inflater = getLayoutInflater();
			final View layout = inflater.inflate(R.layout.user_info_update_user_nickname, findViewById(R.id.user_info_update_user_nickname_LL));
			final EditText nicknameView = layout.findViewById(R.id.user_info_update_user_nicknameView);

			// 数据初始化
			nicknameView.setText(u == null?"":u.getNickname());
			// 将光标移至文字末尾
			WidgetUtils.setCursorToEnd(nicknameView, true);

			// 在AlertView中显示编辑界面
			new AlertDialog.Builder(UserActivity.this)
				.setTitle($$(R.string.user_info_update_nick_name_title))
//				.setIcon(R.drawable.user_info_edit_icon_nick)
				.setView(layout)
				.setPositiveButton($$(R.string.general_save), (dialog, which) -> {
					if(!CommonUtils.isStringEmpty(nicknameView.getText().toString())) {
						// 修改后的内容跟修改前的不相等才需要提交哦
						if(!u.getNickname().equals(nicknameView.getText().toString().trim())) {
							new DataAsyncTask().execute(IS_CHANGE_BASE_INFO, nicknameView.getText().toString()
									// 因此处只需要更新Nickname，但接口是同时更新包括性别在内的两个字段，为
									// 了到服务端更新时不会把sex置空，这里把它未修改的值也原样传过去就好了
									, u.getUser_sex(), u.getUser_uid());
						}
					}
					else {
						Toast.makeText(UserActivity.this, R.string.user_info_update_nick_name_validate, Toast.LENGTH_LONG).show();
					}
				})
				.setNegativeButton($$(R.string.general_cancel), null)
				.show();
		});
		
		// 修改个性签名事件处理
		btnWhatsup.setOnClickListener(v -> {
			// 编辑界面的UI初始化
			LayoutInflater inflater = getLayoutInflater();
			final View layout = inflater.inflate(R.layout.user_info_update_whatsup, findViewById(R.id.user_info_update_what_s_up_LL));
			final EditText whatsupView = layout.findViewById(R.id.user_info_update_whatsupView);
			final TextView whatsupLengthCountView = layout.findViewById(R.id.user_info_other_whatsup_form_moreDescLengthCountView);

			// 添加事件监听，实现文本输入组件已输入字数实时计算和显示
			WidgetUtils.setTextLengthCounter(whatsupView, whatsupLengthCountView);

			// 数据初始化
			whatsupView.setText(u == null?"": u.getWhatsUp());
			// 文本焦点显示在末尾
			WidgetUtils.setCursorToEnd(whatsupView, true);
			// 请求焦点
			whatsupView.requestFocus();

			// 在AlertView中显示编辑界面
			new AlertDialog.Builder(UserActivity.this)
				.setTitle($$(R.string.user_info_what_s_up))
				.setView(layout)
				.setIcon(R.drawable.user_info_edit_icon_whatsup)
				.setPositiveButton($$(R.string.general_save), (dialog, which) -> {
					// 修改后的内容跟修改前的不相等才需要提交哦
					if(u.getWhatsUp() != null && !u.getWhatsUp().equals(whatsupView.getText().toString().trim())) {
						new DataAsyncTask().execute(IS_CHANGE_WHATSUP, whatsupView.getText().toString(), u.getUser_uid());
					}
				})
				.setNegativeButton($$(R.string.general_cancel), null)
				.show();
		});
		
		// 修改其它说明事件处理
		btnOthercaption.setOnClickListener(v -> {
			// 编辑界面的UI初始化
			LayoutInflater inflater = getLayoutInflater();
			final View layout = inflater.inflate(R.layout.user_info_update_othercaption, findViewById(R.id.user_info_update_othercaption_LL));
			final EditText othercaptionView = (EditText) layout.findViewById(R.id.user_info_update_othercaptionView);
			final TextView othercaptionLengthCountView = layout.findViewById(R.id.user_info_other_caption_form_moreDescLengthCountView);

			// 添加事件监听，实现文本输入组件已输入字数实时计算和显示
			WidgetUtils.setTextLengthCounter(othercaptionView, othercaptionLengthCountView);

			// 数据初始化
			othercaptionView.setText(u == null?"": u.getUserDesc());
			// 文本焦点显示在末尾
			WidgetUtils.setCursorToEnd(othercaptionView, true);

			// 在AlertView中显示编辑界面
			new AlertDialog.Builder(UserActivity.this)
				.setTitle($$(R.string.user_info_other_caption))
				.setIcon(R.drawable.user_info_edit_icon_othercaption)
				.setView(layout)
				.setPositiveButton($$(R.string.general_save), (dialog, which) -> {
					// 修改后的内容跟修改前的不相等才需要提交哦
					if(u.getUserDesc() != null && !u.getUserDesc().equals(othercaptionView.getText().toString().trim())) {
						new DataAsyncTask().execute(IS_CHANGE_OTHERCAPTION, othercaptionView.getText().toString(), u.getUser_uid());
					}
				})
				.setNegativeButton($$(R.string.general_cancel), null)
				.show();
		});
		
		// 修改性别事件处理
		btnSex.setOnClickListener(v -> {
			// 编辑界面的UI初始化
			LayoutInflater inflater = getLayoutInflater();
			final View layout = inflater.inflate(R.layout.user_info_update_gender, (RadioGroup) findViewById(R.id.user_info_update_gender_radio_group));
			final RadioButton maleBtn = (RadioButton) layout.findViewById(R.id.user_info_update_gender_male);
			final RadioButton femaleBtn = (RadioButton) layout.findViewById(R.id.user_info_update_gender_female);

			// 数据初始化
			// FIXBUG: NullPointerException (@UserActivity$3:onClick:216) {main}
			if (u != null && u.isMan())
				maleBtn.setChecked(true);
			else
				femaleBtn.setChecked(true);

			// 在AlertView中显示编辑界面
			AlertDialog show = new AlertDialog.Builder(UserActivity.this)
					.setTitle($$(R.string.user_info_update_gender_title))
					.setIcon(R.drawable.user_info_edit_icon_sex)
					.setView(layout)
					.setPositiveButton($$(R.string.general_save), (dialog, which) -> {
						if (!(u.isMan() && maleBtn.isChecked())) {
							new DataAsyncTask().execute(IS_CHANGE_BASE_INFO
									// 因此处只需要更新sex，但接口是同时更新包括性别在内的两个字段，为
									// 了到服务端更新时不会把nickname置空，这里把它未修改的值也原样传过去就好了
									, u.getNickname(), maleBtn.isChecked() ? "1" : "0", u.getUser_uid());
						}
					})
					.setNegativeButton($$(R.string.general_cancel), null)
					.show();
		});
		
		// 修改密码事件处理
		changePswBtn.setOnClickListener(v -> {
			// 编辑界面的UI初始化
			LayoutInflater inflater = getLayoutInflater();
			final View layout = inflater.inflate(R.layout.user_info_update_user_psw, findViewById(R.id.user_info_update_user_psw_LL));
			final EditText oldPswView = layout.findViewById(R.id.user_info_update_user_psw_old_psw);
			final EditText newPswView = layout.findViewById(R.id.user_info_update_user_psw_new_psw);
			final EditText reNewPswView = layout.findViewById(R.id.user_info_update_user_psw_repeat_new_psw);

			// 数据初始化
			oldPswView.setText("");
			newPswView.setText("");
			reNewPswView.setText("");

			// 在AlertView中显示编辑界面
			new AlertDialog.Builder(UserActivity.this)
			.setTitle($$(R.string.user_info_update_psw_title))
//			.setIcon(R.drawable.user_info_edit_icon_changepsw)
			.setView(layout)
			.setPositiveButton($$(R.string.general_save), (dialog, which) -> {
				//验证是否满足修改密码的若干条件
				boolean valid = checkPasswordValide(oldPswView, newPswView, reNewPswView);
				if(valid) {
					String newPsw = String.valueOf(newPswView.getText());
					String oldPsw = String.valueOf(oldPswView.getText());
					new DataAsyncTask().execute(IS_CHANGE_PASSWORD, oldPsw, newPsw, u.getUser_uid());
					allowCloseDialog(dialog, true);
				}
				else {
					//不允许关闭dialog
					allowCloseDialog(dialog, false);
				}
			})
			.setNegativeButton($$(R.string.general_cancel), (dialog, which) -> allowCloseDialog(dialog, true))
			.show();
		});
		
		// 进入个人相册事件处理
		btnProfilePhoto.setOnClickListener(v -> {
			if(u != null)
				startActivityForResult(IntentFactory.createPhotosViewActivityIntent(UserActivity.this, u.getUser_uid(), true), RESULT_CODE_FOR_UPLOAD_PHOTOS);
			PreferencesToolkits.set(UserActivity.this, SHARED_PREFERENCES_KEY_MY$PROFILE_PHOTO_NEW, false);
			refreshNewFlags();
		});
		
		// 进入个人语音留言事件处理
		btnProfileVoice.setOnClickListener(v -> {
			if(u != null)
				startActivityForResult(IntentFactory.createPVoiceViewActivityIntent(UserActivity.this, u.getUser_uid(), true), RESULT_CODE_FOR_UPLOAD_PVOICES);
			PreferencesToolkits.set(UserActivity.this, SHARED_PREFERENCES_KEY_MY$PROFILE_VOICE_NEW, false);
			refreshNewFlags();
		});
		
		super.initListeners();
	}

	/**
	 * 刷新界面上的某些功能"NEW"标识的显示。
	 */
	private void refreshNewFlags() {
		View photoNewFlag = findViewById(R.id.user_info_photos_viewNewFlag);
		View voicesNewFlag = findViewById(R.id.user_info_voices_viewNewFlag);

		if(PreferencesToolkits.is(this, SHARED_PREFERENCES_KEY_MY$PROFILE_PHOTO_NEW, true))
			photoNewFlag.setVisibility(View.VISIBLE);
		else
			photoNewFlag.setVisibility(View.GONE);

		if(PreferencesToolkits.is(this, SHARED_PREFERENCES_KEY_MY$PROFILE_VOICE_NEW, true))
			voicesNewFlag.setVisibility(View.VISIBLE);
		else
			voicesNewFlag.setVisibility(View.GONE);
	}
	
	/**
	 * 刷新界面数据的显示。
	 */
	private void refreshDatas() {
		Log.e(TAG, "----> u="+u);
		if(u != null) {
			Log.e(TAG, "----> u is not null");
			nameTextView.setText(u.getNickname());
			uidTextView.setText(u.getUser_uid());
			emailTextView.setText(u.getUser_mail());
			sexTextView.setText(u.isMan() ? $$(R.string.user_info_sex_male) : $$(R.string.user_info_sex_female));
			if(!CommonUtils.isStringEmpty((String)u.getWhatsUp(),true))
				whatsupTextView.setText((String)u.getWhatsUp());
			else
				whatsupTextView.setText($$(R.string.user_info_what_s_up_enter_hint));
			
			if(!CommonUtils.isStringEmpty((String)u.getUserDesc(),true))
				othercaptionTextView.setText((String)u.getUserDesc());
			else
				othercaptionTextView.setText($$(R.string.user_info_other_caption_hint));
			
			Log.e(TAG, "----> u.getUserAvatarFileName="+u.getUserAvatarFileName()+", isNull?"+(u.getUserAvatarFileName() == null));
			
			// Bug FIX: 20160801 by js: 解决更新更多说明等内容后用户头像会被错误地显示成默认头像 START
			// 当用户没有设置头像时为他设置一个默认图标作为头像
			if(CommonUtils.isStringEmpty(u.getUserAvatarFileName())) {
				Log.e(TAG, "----> u.isMan?"+u.isMan());
//				if(u.isMan())
//					viewAvatar.setImageResource(R.drawable.default_avatar);
//				else
//					viewAvatar.setImageResource(R.drawable.default_avatar);
			}
			// Bug FIX: 20160801 by js: 解决更新更多说明等内容后用户头像会被错误地显示成默认头像 END
			
			// 获取该用户的相片数、声音数
			loadPhotosAndVoicesCount();
		}
	}

	private void refreshPhotoCountShow(int count) {
		if(count > 0) {
			viewPhotosCount.setVisibility(View.VISIBLE);
			viewPhotosCount.setText(String.valueOf(count));
		}
		else {
			viewPhotosCount.setVisibility(View.GONE);
		}
	}

	private void refreshPVoiceCount(int count) {
		if(count > 0) {
			viewPVoiceCount.setVisibility(View.VISIBLE);
			viewPVoiceCount.setText(String.valueOf(count));
		}
		else {
			viewPVoiceCount.setVisibility(View.GONE);
		}
	}
	
	// 尝试异步加载本地用户头像
	public void loadAvatar() {
		if(u != null) {
			// 显示本地用户头像
			ImageCacheLoader.loadAvatarImgWithGlide(this, u.getUser_uid(), u.getUserAvatarFileName()
					, this.findViewById(R.id.main_more_settings_avatarView), 30
					, R.drawable.default_avatar_yuan_60_3x, false, false);

			// 本地用户头像
//			new ShowUserAvatar(this, u.getUser_uid()
//					, (ImageView) this.findViewById(R.id.main_more_settings_avatarView)
//					// 注意：打开本界面时如果存在本地缓存则就不需要尝试去服务端更新
//					// 最新了（这跟MoreActivity里的逻辑不一样哦），因为前一个MoreActivity界面
//					// 里已经尝试过了，本界面就没有必要了，节约服务器端性能压力吧
//					, false
//					, 120 , 120 // 此头像用于界面中好友的头像显示，大小参考：user_info布局中的@+id/main_more_settings_avatarView（60dp*60dp）
//			).showCahedAvatar();
		}
	}
	
	// 异步刷新界面上的个人照片数和个人语音介绍数
	private void loadPhotosAndVoicesCount() {
		// 获取该用户的相片数、声音数
		new ProfileHelper.QueryPhotosAndPVoiceCountAsyncTask(this, u.getUser_uid()) {
			/**
			 * 成功处理后要调用的方法：找到了相片数.
			 */
			@Override
			protected void onPostExecute_findPhotoCount(int count) {
				refreshPhotoCountShow(count);
			}

			/**
			 * 成功处理后要调用的方法：找到了我的声音数.
			 */
			@Override
			protected void onPostExecute_findPVoiceCount(int count) {
				refreshPVoiceCount(count);
			}
		}.execute();
	}

	@Override
	protected DataFromServer queryData(String... arg0) {
		return null;
	}

	@Override
	protected void refreshToView(Object arg0) {
	}
	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// 处理回调：把最新的相片或声音数更新到界面（如果本次已上传新相片或声音则以便即时显示）
		super.onActivityResult(requestCode, resultCode, data);

		if (requestCode == RESULT_CODE_FOR_UPLOAD_PHOTOS    // 此ActivityResult数据来自个人相片列表界面
				|| requestCode == RESULT_CODE_FOR_UPLOAD_PVOICES)// 此ActivityResult数据来自个人语音列表界面
		{
			if (resultCode == RESULT_OK) {
				Bundle extras = data.getExtras();
				if (extras != null) {
					int currentCount = extras.getInt("__current_count_");
					if (requestCode == RESULT_CODE_FOR_UPLOAD_PHOTOS) {
						viewPhotosCount.setText(String.valueOf(currentCount));
						refreshPhotoCountShow(currentCount);
					} else if (requestCode == RESULT_CODE_FOR_UPLOAD_PVOICES) {
						viewPVoiceCount.setText(String.valueOf(currentCount));
						refreshPVoiceCount(currentCount);
					}
				}
			}
		} else
			// 是拍照或从相册选择图片完成后
			profilePhotoWrapper.onParantActivityResult(requestCode, resultCode, data);
	}
	
	@Override
	public void finish() {
		this.setResult(RESULT_OK);
		super.finish();
	}


	//----------------------------------------------------------------------------------- 以下是内部类
	
	/**
	 * 提交数据请求和处理的异步执行线程实现类.
	 */
	protected class DataAsyncTask extends DataLoadingAsyncTask2<Object, Integer, DataFromServer> {

		private int sysActionConst = 0;
		private Object[] params = null;

		public DataAsyncTask() {
			super(UserActivity.this, $$(R.string.general_submitting));
		}

		/**
		 * 在后台执行信息的提交和处于结果的读取 .
		 *
		 * @param params 外界传进来的参数
		 * @return 查询结果，将传递给onPostExecute(..)方法
		 */
		@Override
		protected DataFromServer doInBackground(Object... params) {
			this.params = params;
			this.sysActionConst = (Integer) params[0];

			if (sysActionConst == IS_CHANGE_PASSWORD) {
				return HttpRestHelper.submitUserPasswordModifiyToServer(
						(String) params[1], (String) params[2], (String) params[3]);
			} else if (sysActionConst == IS_CHANGE_BASE_INFO) {
				return HttpRestHelper.submitUserBaseInfoModifiyToServer(
						(String) params[1], (String) params[2], (String) params[3]);
			} else if (sysActionConst == IS_CHANGE_WHATSUP) {
				return HttpRestHelper.submitUserWhatsUpModifiyToServer((String) params[1], (String) params[2]);
			} else if (sysActionConst == IS_CHANGE_OTHERCAPTION) {
				return HttpRestHelper.submitUserOtherCaptionModifiyToServer((String) params[1], (String) params[2]);
			} else if (sysActionConst == 0) {
				DataFromServer dfs = new DataFromServer();
				dfs.setSuccess(false);
				return dfs;
			}

			return null;
		}

		/**
		 * 处理服务端返回的登陆结果信息.
		 */
		protected void onPostExecuteImpl(Object result) {
			int resId;
			boolean updateSucess = "1".equals((String) result);

			if (updateSucess)
				resId = R.string.user_info_update_success;
			else {
				resId = R.string.general_error;
			}

			if (sysActionConst == IS_CHANGE_PASSWORD) {
				if ("2".equals((String) result))
					resId = R.string.user_info_update_user_psw_old_psw_false;
			} else if (sysActionConst == IS_CHANGE_BASE_INFO) {
				// 只在服务端已更新成功时才刷新客户端数据显示
				if (updateSucess) {
					u.setNickname((String) params[1]);
					u.setUser_sex((String) params[2]);
					refreshDatas();

					resId = R.string.user_info_update_success;
				} else
					resId = R.string.user_info_update_failure;

			} else if (sysActionConst == IS_CHANGE_WHATSUP) {
				// 只在服务端已更新成功时才刷新客户端数据显示
				if (updateSucess) {
					u.setWhatsUp((String) params[1]);
					refreshDatas();
				}
			} else if (sysActionConst == IS_CHANGE_OTHERCAPTION) {
				// 只在服务端已更新成功时才刷新客户端数据显示
				if (updateSucess) {
					u.setUserDesc((String) params[1]);
					refreshDatas();
				}
			}

			ToolKits.showCommonTosat(UserActivity.this, updateSucess, resId, Toast.LENGTH_SHORT);
//			Toast.makeText(UserActivity.this, resId, Toast.LENGTH_LONG).show();
		}
	}

	private void allowCloseDialog(DialogInterface dialog, boolean allow) {
		try {
			Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
			field.setAccessible(true);
			field.set(dialog, allow);
		} catch (Exception e) {
			Log.w(TAG, e.getMessage(), e);
		}
	}
	
	// 修改密码时的合法性检查
	private boolean checkPasswordValide(TextView viewOldPsw, TextView viewNewPsw, TextView viewReNewPsw) {
		String oldPsw = String.valueOf(viewOldPsw.getText());
		String newPsw = String.valueOf(viewNewPsw.getText());
		String reNewPsw = String.valueOf(viewReNewPsw.getText());

		// 当前密码是否为空
		if (CommonUtils.isStringEmpty(oldPsw)) {
			viewOldPsw.setError($$(R.string.user_info_update_user_psw_invalid_hint1));
			return false;
		}

		// 新密码是否为空
		if (CommonUtils.isStringEmpty(newPsw)) {
			viewNewPsw.setError($$(R.string.user_info_update_user_psw_invalid_hint2));
			return false;
		}

		// 确认密码是否为空
		if (CommonUtils.isStringEmpty(reNewPsw)) {
			viewReNewPsw.setError($$(R.string.user_info_update_user_psw_invalid_hint3));
			return false;
		}

		// 两次输入新密码是否一致
		if (!newPsw.equals(reNewPsw)) {
			viewNewPsw.setError($$(R.string.user_info_update_user_psw_new_psw_not_equal));
			viewReNewPsw.setError($$(R.string.user_info_update_user_psw_new_psw_not_equal));
			return false;
		}

		// 新密码长度是否大于6
		if (newPsw.length() < 6) {
			viewNewPsw.setError($$(R.string.user_info_update_user_psw_length));
			return false;
		}

		// 旧登录密码与新密码是相同的（未修改！）
		if (oldPsw.equals(newPsw)) {
			viewNewPsw.setError($$(R.string.user_info_update_user_psw_old_equal_new));
			return false;
		}

		return true;
	}
	
	//----------------------------------------------------------------------------------- inner class
	
}
